/**
 * \file main.c
 * \author H4201
 *
 * @mainpage Projet CIAI 
 *
 Documentation de l'application pour la supervision à distance 
 d'une ligne de conditionnement et d'expédition temps réel
 *
 */

#include <stdio.h>
#include <stdlib.h>
#include <sched.h>
#include <pthread.h>
#include <string.h>
#include <unistd.h>
#include <sys/time.h>

#include "main.h"
#include "../mere/mere.h"

/**
 * Fonction d'entrée du programme.
 * Peut prendre un numéro de port en paramètre sur la ligne de commande.
 * \param[in] argc Le nombre de paramètre passé sur la ligne de commande
 * \param[in] argv Les paramètres
 */
int main(int argc, char ** argv) {
    pthread_t mainThread;
    int err, numero_port = -1;
    pthread_attr_t attr;	
    struct sched_param param;
    char *endptr;
    
    // Décodage de l'unique paramètre
    if (argc >= 2) {
        numero_port = strtol(argv[1], &endptr, 10);
        if (endptr == argv[1]) {
            numero_port = -1;
        }
    }
    
    if (numero_port == -1) {
        numero_port = 53000;
    }

    // Démarrage du thread mère
    pthread_attr_init (& attr);

    if ((err = pthread_attr_setschedpolicy(& attr, SCHED_FIFO)) != 0) {
        fprintf(stderr, "setschedpolicy: %s\n", strerror(err));
        exit(EXIT_FAILURE);
    }
    if ((err = pthread_attr_setinheritsched(& attr, PTHREAD_EXPLICIT_SCHED)) != 0) {
        fprintf(stderr, "setinheritsched: %s\n", strerror(err));
        exit(EXIT_FAILURE);
    }
	
    param.sched_priority = 99;

    if ((err = pthread_attr_setschedparam(& attr, & param)) != 0) {
        fprintf(stderr, "setschedparam: %s\n", strerror(err));
        exit(EXIT_FAILURE);
    }
    

    if ((err = pthread_create(&mainThread, & attr, &mere, (void *) numero_port)) != 0) {
        fprintf(stderr, "pthread_create mere : %s\n", strerror(err));
        exit(EXIT_FAILURE);
    }

    pthread_join(mainThread, NULL);

    return 0;
}
